/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.com.cotelasa.scp.controlador;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.logging.Level;
import javax.faces.event.ActionEvent;
import javax.inject.Inject;
import javax.inject.Named;
import org.apache.log4j.Logger;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import pe.com.cotelasa.common.controlador.MBGenerico;
import pe.com.cotelasa.common.dao.excepcion.DAOException;
import pe.com.cotelasa.scp.common.IObserver;
import pe.com.cotelasa.scp.controlador.backingBean.BKVentaCobranza;
import pe.com.cotelasa.scp.dominio.common.COLOR_ESTADO_VENTA;
import pe.com.cotelasa.scp.dominio.common.TIPO_DOC_VENTA;
import pe.com.cotelasa.scp.dominio.common.TIPO_FORMA_PAGO;
import pe.com.cotelasa.scp.dominio.common.TIPO_MONEDA;
import pe.com.cotelasa.scp.dominio.common.URLPaginacion;
import pe.com.cotelasa.scp.dominio.excepcion.ServiceException;
import pe.com.cotelasa.scp.dominio.service.IServicioTipoMoneda;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaFacturacion;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaLineaCredito;
import pe.com.cotelasa.scp.dominio.service.IServicioVentaLineaCreditoDetalle;
import pe.com.cotelasa.scp.entidad.Cliente;
import pe.com.cotelasa.scp.entidad.TipoMoneda;
import pe.com.cotelasa.scp.entidad.VentaFacturacion;
import pe.com.cotelasa.scp.entidad.VentaLineaCredito;
import pe.com.cotelasa.scp.entidad.VentaLineaCreditoDetalle;
import pe.com.cotelasa.seguridad.controlador.backingBean.BKSession;

/**
 *
 * @author Jorge
 */
@SuppressWarnings({"serial", "unchecked"})
@Named(value = "MBVentaCobranza")
@Scope("request")
public class MBVentaCobranza extends MBGenerico implements IMantenedor, IObserver, Serializable {

    private static Logger logger = Logger.getLogger(MBVentaCobranza.class);
    @Inject
    private BKVentaCobranza bkVentaCobranza;
    @Inject
    private IServicioVentaFacturacion servicioVentaFacturacion;
    @Inject
    private IServicioTipoMoneda servicioTipoMoneda;
    @Inject
    private MBComponenteFindCliente mbComponenteFindCliente;
    @Inject
    private IServicioVentaLineaCredito servicioVentaLineaCredito;
    @Inject
    private IServicioVentaLineaCreditoDetalle servicioVentaLineaCreditoDetalle;
    @Autowired
    BKSession session;
    
    @Override
    public String actualizar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String guardar() {
        double monto = bkVentaCobranza.getMonto();

        if (bkVentaCobranza.getIdTipoMoneda() == TIPO_MONEDA.SOLES.getValor()) {

            for (VentaFacturacion factura : bkVentaCobranza.getListaFacturasPendientes()) {

                if (factura.getMoneda().getId() == TIPO_MONEDA.SOLES.getValor()) {
                    if (monto >= factura.getPorCobrar()) {
                        double porcobrar = factura.getPorCobrar();

                        factura.setEstado(COLOR_ESTADO_VENTA.PAGADA.getEstado());
                        factura.setPorCobrar(factura.getPorCobrar() - factura.getPrecioVenta());
                        factura.setAcuenta(factura.getPrecioVenta());
                        factura.setFecCancelacion(new Date());
                        servicioVentaFacturacion.actualizarVentaFacturacion(factura);

                        monto = monto - porcobrar;

                    } else {
                        if (monto > 0) {
                            factura.setEstado(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getEstado());
                            factura.setPorCobrar(factura.getPorCobrar() - monto);
                            factura.setAcuenta(monto);
                            servicioVentaFacturacion.actualizarVentaFacturacion(factura);
                        }
                        break;
                    }
                }
                if (factura.getMoneda().getId() == TIPO_MONEDA.DOLARES.getValor()) {

                    double porcobrar = factura.getPorCobrar() * factura.getTipoCambio();
                    if (monto >= porcobrar) {

                        factura.setEstado(COLOR_ESTADO_VENTA.PAGADA.getEstado());
                        factura.setPorCobrar(factura.getPorCobrar() - factura.getPrecioVenta());
                        factura.setAcuenta(factura.getPrecioVenta());
                        factura.setFecCancelacion(new Date());
                        servicioVentaFacturacion.actualizarVentaFacturacion(factura);

                        monto = monto - porcobrar;

                    } else {
                        monto = monto / factura.getTipoCambio();
                        if (monto > 0) {
                            factura.setEstado(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getEstado());
                            factura.setPorCobrar(factura.getPorCobrar() - monto);
                            factura.setAcuenta(monto);
                            servicioVentaFacturacion.actualizarVentaFacturacion(factura);
                        }
                        break;
                    }
                }
            }

            VentaLineaCredito lineaCredito = new VentaLineaCredito();
            try {
                lineaCredito = servicioVentaLineaCredito.getVentaLineaCredito(bkVentaCobranza.getCliente().getNumeroDocumento());
            } catch (ServiceException ex) {
                mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
                logger.error(ex.getMessage(), ex);
            }

            VentaLineaCreditoDetalle detalle = new VentaLineaCreditoDetalle();
            detalle.setDetalleCredito("Pago deuda");
            detalle.setMontoCredito(bkVentaCobranza.getMonto());
            detalle.setFechaOperacion(new Date());
            detalle.setLineaSaldo(lineaCredito.getLineaSaldo() + bkVentaCobranza.getMonto());
            detalle.setIdlinea(lineaCredito);
            servicioVentaLineaCreditoDetalle.guardarLineaCreditoDetalle(detalle);

            lineaCredito.setLineaSaldo(lineaCredito.getLineaSaldo() + bkVentaCobranza.getMonto());
            lineaCredito.setLineaUsada(lineaCredito.getLineaCredito() - lineaCredito.getLineaSaldo());

            servicioVentaLineaCredito.actualizarLineaCredito(lineaCredito);


        }
        if (bkVentaCobranza.getIdTipoMoneda() == TIPO_MONEDA.DOLARES.getValor()) {

            double pago_monto = 0.0;

            for (VentaFacturacion factura : bkVentaCobranza.getListaFacturasPendientes()) {

                if (factura.getMoneda().getId() == TIPO_MONEDA.DOLARES.getValor()) {
                    if (monto >= factura.getPorCobrar()) {
                        double porcobrar = factura.getPorCobrar();

                        factura.setEstado(COLOR_ESTADO_VENTA.PAGADA.getEstado());
                        factura.setPorCobrar(factura.getPorCobrar() - factura.getPrecioVenta());
                        factura.setAcuenta(factura.getPrecioVenta());
                        servicioVentaFacturacion.actualizarVentaFacturacion(factura);

                        monto = monto - porcobrar;

                        pago_monto = pago_monto + porcobrar * factura.getTipoCambio();

                    } else {
                        if (monto > 0) {
                            factura.setEstado(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getEstado());
                            factura.setPorCobrar(factura.getPorCobrar() - monto);
                            factura.setAcuenta(monto);
                            servicioVentaFacturacion.actualizarVentaFacturacion(factura);

                            pago_monto = pago_monto + monto * factura.getTipoCambio();
                        }
                        break;
                    }
                }
                if (factura.getMoneda().getId() == TIPO_MONEDA.SOLES.getValor()) {

                    double porcobrar = factura.getPorCobrar() / factura.getTipoCambio();
                    if (monto >= porcobrar) {

                        factura.setEstado(COLOR_ESTADO_VENTA.PAGADA.getEstado());
                        factura.setPorCobrar(factura.getPorCobrar() - factura.getPrecioVenta());
                        factura.setAcuenta(factura.getPrecioVenta());
                        servicioVentaFacturacion.actualizarVentaFacturacion(factura);

                        monto = monto - porcobrar;

                        pago_monto = pago_monto + porcobrar * factura.getTipoCambio();

                    } else {
                        monto = monto * factura.getTipoCambio();
                        if (monto > 0) {
                            factura.setEstado(COLOR_ESTADO_VENTA.PAGADA_PARCIAL.getEstado());
                            factura.setPorCobrar(factura.getPorCobrar() - monto);
                            factura.setAcuenta(monto);
                            servicioVentaFacturacion.actualizarVentaFacturacion(factura);

                            pago_monto = pago_monto + monto / factura.getTipoCambio();
                        }
                        break;
                    }
                }
            }

            VentaLineaCredito lineaCredito = new VentaLineaCredito();
            try {
                lineaCredito = servicioVentaLineaCredito.getVentaLineaCredito(bkVentaCobranza.getCliente().getNumeroDocumento());
            } catch (ServiceException e) {
                mostrarError("Ocurrieron algunos problemas al actualizar la informacion. Vuelva a intentar.");
                logger.error(e.getMessage(), e);
            }

            VentaLineaCreditoDetalle detalle = new VentaLineaCreditoDetalle();
            detalle.setDetalleCredito("Pago deuda");
            detalle.setMontoCredito(pago_monto);
            detalle.setFechaOperacion(new Date());
            detalle.setLineaSaldo(lineaCredito.getLineaSaldo() + pago_monto);
            detalle.setIdlinea(lineaCredito);
            servicioVentaLineaCreditoDetalle.guardarLineaCreditoDetalle(detalle);

            lineaCredito.setLineaSaldo(lineaCredito.getLineaSaldo() + pago_monto);
            lineaCredito.setLineaUsada(lineaCredito.getLineaCredito() - lineaCredito.getLineaSaldo());

            servicioVentaLineaCredito.actualizarLineaCredito(lineaCredito);


        }

        try {

            bkVentaCobranza.setListaFacturasPendientes(servicioVentaFacturacion.listarFacturacionPendientes(
                    TIPO_DOC_VENTA.FACTURA.getValor(), TIPO_FORMA_PAGO.CREDITO.getValor(), bkVentaCobranza.getCliente().getId(), COLOR_ESTADO_VENTA.EMITIDO.getEstado(),session.getSede().getId()));
            for (VentaFacturacion factura : bkVentaCobranza.getListaFacturasPendientes()) {

                if (factura.getMoneda().getId() == TIPO_MONEDA.SOLES.getValor()) {
                    bkVentaCobranza.setMontoSoles(bkVentaCobranza.getMontoSoles() + factura.getPrecioVenta());
                    bkVentaCobranza.setMontoDolares(bkVentaCobranza.getMontoDolares() + factura.getPrecioVenta() / factura.getTipoCambio());
                }

                if (factura.getMoneda().getId() == TIPO_MONEDA.DOLARES.getValor()) {
                    bkVentaCobranza.setMontoSoles(bkVentaCobranza.getMontoSoles() + factura.getPrecioVenta() * factura.getTipoCambio());
                    bkVentaCobranza.setMontoDolares(bkVentaCobranza.getMontoDolares() + factura.getPrecioVenta());
                }

            }
        } catch (ServiceException ex) {
            java.util.logging.Logger.getLogger(MBVentaCobranza.class.getName()).log(Level.SEVERE, null, ex);
        }

        return null;
    }

    @Override
    public void eliminar(ActionEvent actionEvent) {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String editar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String nuevo() {
        try {
            bkVentaCobranza.setListaTipoMoneda(new ArrayList<TipoMoneda>(servicioTipoMoneda.listarTipoMonedasActivos()));
            bkVentaCobranza.setMonto(0);
            bkVentaCobranza.setIdTipoMoneda(0);
        } catch (ServiceException ex) {
            java.util.logging.Logger.getLogger(MBVentaCobranza.class.getName()).log(Level.SEVERE, null, ex);
        }
        return null;
    }

    @Override
    public String ver() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String aceptar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String retroceder() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public String cancelar() {
        throw new UnsupportedOperationException("Not supported yet.");
    }

    @Override
    public void actualizarObservador(Object object) {
        if (object instanceof Cliente) {
            try {
                Cliente cliente = (Cliente) object;
                bkVentaCobranza.setCliente(cliente);
                bkVentaCobranza.setListaFacturasPendientes(servicioVentaFacturacion.listarFacturacionPendientes(
                        TIPO_DOC_VENTA.FACTURA.getValor(), TIPO_FORMA_PAGO.CREDITO.getValor(), cliente.getId(), COLOR_ESTADO_VENTA.EMITIDO.getEstado(),session.getSede().getId() ));
                
                System.out.println(""+bkVentaCobranza.getListaFacturasPendientes());
                for (VentaFacturacion factura : bkVentaCobranza.getListaFacturasPendientes()) {
                    System.out.println(""+factura.getNumFactura());
                    if (factura.getMoneda().getId() == TIPO_MONEDA.SOLES.getValor()) {
                        bkVentaCobranza.setMontoSoles(bkVentaCobranza.getMontoSoles() + factura.getPrecioVenta());
                        bkVentaCobranza.setMontoDolares(bkVentaCobranza.getMontoDolares() + factura.getPrecioVenta() / factura.getTipoCambio());
                    }

                    if (factura.getMoneda().getId() == TIPO_MONEDA.DOLARES.getValor()) {
                        bkVentaCobranza.setMontoSoles(bkVentaCobranza.getMontoSoles() + factura.getPrecioVenta() * factura.getTipoCambio());
                        bkVentaCobranza.setMontoDolares(bkVentaCobranza.getMontoDolares() + factura.getPrecioVenta());
                    }

                }
            } catch (ServiceException ex) {
                java.util.logging.Logger.getLogger(MBVentaCobranza.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public String mostrarPendientes() {
        mbComponenteFindCliente.clearObserver();
        mbComponenteFindCliente.addObserver(this);
        bkVentaCobranza.setCliente(null);
        bkVentaCobranza.setListaFacturasPendientes(new ArrayList<VentaFacturacion>());
        bkVentaCobranza.setMontoDolares(0);
        bkVentaCobranza.setMontoSoles(0);
        return URLPaginacion.Ventas.URL_COBRANZA_PEDIENTES_PAGO;
    }

    public String registrarPago() {
        return URLPaginacion.Ventas.URL_COBRANZA_REGISTRAR_PAGO;
    }

    public void buscarListaPendientes(ActionEvent actionEvent) {
    }

    public void exportar() {
    }
}
